ep20把我這幾天以來的文章,標題開頭是二的文章都梳理一遍,然後相信大家絕對不記得,或看到一半會忘記,我到底是從哪裡開始追蹤原始碼,以及為什麼會照這個順序。
我們最初是在train.py
遇到他呼叫data_generator.py
的get_one_shot_iterator()
method,目的是為了取得訓練資料,才開始了長達20天的追蹤。
我們追蹤到現在,好不容易把這個method呼叫的map function:_parse_function
和_preprocess_image
都講完了,最後還剩下一點點的程式,就可以從data_generator.py
跳回train.py
了。
接著再繼續吧。
datasets/data_generator.py
(cont.)331行是將dataset加上打亂的功能,因為這個tf.data API是講求效率的,所以並不會一次load近所有資料,才能節省佔用GPU的空間。這個buffer_size就是一次會load 100筆資料,然後把它打亂後提供後續使用,也就是說,如果要讓資料完全打亂,buffer_size要比資料筆數多才行(但這樣似乎也失去了使用tf.data有效率的初衷?)。
是說訓練時所需要的記憶體量,如果你是使用GPU的話,你要增加以及關注的記憶體容量是在GPU本身內部的,跟系統的記憶體量沒有關係!
所以如果訓練的程式在沒有確認過記憶體用量的情況下,從用CPU跑,改成用GPU跑,有的時候會出現記憶體不足的情況。
這就是因為,使用GPU,他只會用GPU自帶的記憶體去暫存資料。
334行是將資料集的長度延長,會這樣做是因為dataset會變成一個iterator,那iterator呼叫到沒有東西可以丟出來就會結束,所以這個是讓iterator的長度可以變長的method。
batch()
,他會規定每呼叫一次dataset iterator,iterator會吐出多少筆資料來。在校長頒獎時,旁邊會有大使拿著一疊獎狀供校長拿取,這樣可以快速進行頒獎。
train.py
我們花了這麼多天去追的程式,在主程式中,只有短短一行呼叫,而且是作為模型參數。
歐對了,說來說去還有模型的部分沒有說到,但因為deeplab的程式是有用提供給多GPU的使用者,所以他的模型寫法跟只有一個GPU的寫法差很多。
deeplab的model本身定義在_build_deeplab()
這個method中,也就是train.py
的第221行那裡。
然後之後321行用_build_deeplab()
的定義去把模型部署分工,讓不同GPU之間能合作把這個模型訓練起來。
我下次試著描寫這個定義的部分,但剩下2篇的扣打,我想想要怎麼寫才好XD